function getAllATag(htmlString) {
  // 匹配所有a标签的正则表达式
  const aTagRegex = /<a\s+[^>]*>(.*?)<\/a>/gi;
  const result = [];
  let match;

  // 循环匹配所有a标签
  while ((match = aTagRegex.exec(htmlString)) !== null) {
    const fullTag = match[0];
    const tagContent = match[1];

    // 过滤掉包含"返回目录"的a标签
    if (!tagContent.includes("返回目录")) {
      // 提取href属性值的正则
      const hrefRegex = /href\s*=\s*["']([^"']*)["']/i;
      const hrefMatch = fullTag.match(hrefRegex);
      const href = hrefMatch ? hrefMatch[1] : "";

      result.push({
        href: href,
        text: tagContent.trim(),
      });
    }
  }

  return result;
}

function processHightLightHtml(keyword, originalText) {
  // 解析原HTML为DOM树（避免字符串替换破坏标签）
  const parser = new DOMParser();
  const doc = parser.parseFromString(
    originalText
      .replace(/&lt;/gi, "<")
      .replace(/&gt;/gi, ">")
      .replace(/&quot;/gi, '"'),
    "text/html"
  );
  const processedDoc = doc.cloneNode(true);
  let anchorCounter = 0; // 锚点计数器（用于生成唯一ID）
  // 转义关键字（处理.、*、?等正则特殊字符）
  const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  const keywordReg = new RegExp(`(${escapedKeyword})`, "gi"); // 分组捕获关键字

  // 递归遍历DOM，仅处理文本节点（不修改元素标签）
  const traverseTextNodes = (node) => {
    // 跳过脚本、样式等非内容节点
    if (node.nodeType === Node.SCRIPT_NODE || node.nodeType === Node.STYLE_NODE)
      return;

    // 处理文本节点：拆分关键字并加高亮+锚点
    if (node.nodeType === Node.TEXT_NODE && node.textContent.trim()) {
      const text = node.textContent;
      if (!keywordReg.test(text)) return; // 无关键字则跳过

      const fragment = document.createDocumentFragment();
      let lastTextPos = 0;
      let match;

      // 重置正则索引（避免全局匹配重复）
      keywordReg.lastIndex = 0;

      while ((match = keywordReg.exec(text)) !== null) {
        const matchStart = match.index;
        const matchEnd = keywordReg.lastIndex;
        const matchedText = match[1];

        // 1. 添加关键字前的普通文本
        if (matchStart > lastTextPos) {
          fragment.appendChild(
            document.createTextNode(text.slice(lastTextPos, matchStart))
          );
        }

        // 2. 关键字加高亮+锚点（计数器自增，生成唯一ID）
        anchorCounter++;
        const highlightSpan = document.createElement("span");
        highlightSpan.className = "keyword-highlight";
        highlightSpan.style.color = "red";
        highlightSpan.style.backgroundColor = "yellow";
        highlightSpan.style.fontWeight = "bold";
        highlightSpan.id = `txt${anchorCounter}`; // 锚点ID：txt1、txt2...
        highlightSpan.textContent = matchedText;
        fragment.appendChild(highlightSpan);

        lastTextPos = matchEnd;
      }

      // 3. 添加关键字后的普通文本
      if (lastTextPos < text.length) {
        fragment.appendChild(document.createTextNode(text.slice(lastTextPos)));
      }

      // 替换原文本节点（保留父级HTML标签结构）
      node.parentNode.replaceChild(fragment, node);
    }

    // 递归处理子节点（如<p>、<a>等元素的子节点）
    Array.from(node.childNodes).forEach((child) => traverseTextNodes(child));
  };

  // 执行DOM遍历处理
  traverseTextNodes(processedDoc.body);
  return processedDoc.body.innerHTML; // 返回处理后的HTML字符串
}
function getPlainTextFromHtml(html) {
  const parser = new DOMParser();
  const doc = parser.parseFromString(html.replace(/&lt;/gi, '<')
      .replace(/&gt;/gi, '>')
      .replace(/&quot;/gi, '"'), "text/html");
  // 提取纯文本 + 清除多余空格（避免标签残留干扰）
  return doc.body.textContent.trim().replace(/\s+/g, " ");
}
function getMatchResults(keyword, htmlString, length) {
  const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  const keywordReg = new RegExp(escapedKeyword, "gi");
  let match;
  let matchResults = [];
  let plainTextCopy = getPlainTextFromHtml(
    htmlString
      .replace(/&lt;/gi, "<")
      .replace(/&gt;/gi, ">")
      .replace(/&quot;/gi, '"')
  );
  // 重置正则索引
  keywordReg.lastIndex = 0;

  // 遍历纯文本匹配关键字，生成结果数组
  while ((match = keywordReg.exec(plainTextCopy)) !== null) {
    const matchStart = match.index;
    const matchEnd = keywordReg.lastIndex;
    const matchedText = match[0];

    // 计算关键字前后上下文（避免越界）
    const beforeStart = Math.max(0, matchStart - length);
    const beforeText = plainTextCopy.slice(beforeStart, matchStart);
    const afterEnd = Math.min(plainTextCopy.length, matchEnd + length);
    const afterText = plainTextCopy.slice(matchEnd, afterEnd);

    // 处理省略号（优化显示）
    const displayBefore = beforeStart > 0 ? "..." + beforeText : beforeText;
    const displayAfter =
      afterEnd < plainTextCopy.length ? afterText + "..." : afterText;

    // 生成超链接（与原HTML锚点一一对应：#txt1、#txt2...）
    const matchIndex = matchResults.length + 1; // 锚点计数器与结果索引同步
    matchResults.push({
      before: displayBefore,
      keyword: matchedText,
      after: displayAfter,
      link: `#txt${matchIndex}`, // 超链接对应原HTML锚点
    });
  }
  return matchResults;
}
export {
  getAllATag,
  getMatchResults,
  processHightLightHtml,
  getPlainTextFromHtml,
};
